const xy = require('../utils/xy')
const cartModel = require('../db/cart')
const writeErr = require('../utils/writeErr')
const dishModel = require('../db/dish')

module.exports = {
    // 添加购物车
    async add(req, resp) {
        // 获取post的数据
        let {userId, dishId, number, speandkind} = req.body
        if(!userId || !dishId || !number || !speandkind) {
            xy(resp, 401, '数据不能为空！')
            return
        }
        // 先查询
        try{
            let docs = await cartModel.findOne({userId, dishId, speandkind})
            if(docs) {
                try{
                    docs = await cartModel.updateOne({userId, dishId, speandkind, number: docs.number + +number})
                    xy(resp, 200, '购物车添加成功')
                }catch(err) {
                    writeErr(err)
                    xy(resp, 507, '购物车添加失败！')
                }
                return
            }
            try{
                docs = await cartModel.insertMany({userId, dishId, number, speandkind})
                xy(resp, 200, '购物车添加成功')
            }catch(err) {
                writeErr(err)
                xy(resp, 507, '购物车添加失败！')
            }
        }catch(err) {
            writeErr(err)
            xy(resp, 507, '购物车添加失败！')
        }
    },
    // 获取当前用户的购物车数量
    async getnum(req, resp) {
        // 接收当前用户id
        let {userId} = req.params
        try{
           let docs = await cartModel.count({userId})
           xy(resp, 200, '购物车数量获取成功！', {
                number: docs
            })
        }catch(err) {
            writeErr(err)
            xy(resp, 508, '购物车数量获取失败！')
        }
    },
    // 获取购物车所有商品
    async getall(req, resp) {
        // 接收用户id
        let {userId} = req.params
        try{
            let docs = await cartModel.find({userId})
            // 原本的数据不能进行增、删、改 - 对原本的数据做深拷贝
            docs = JSON.parse(JSON.stringify(docs))
            // 遍历数组，将数组中的每一个对象获取到 - 每个对象中的dishId获取商品数据
            // docs = await docs.map(cart => {
            //     // cart.dishId - 商品id - 那他查询商品数据
            //     let dish = dishModel.findOne({_id: cart.dishId})
            //     // // 将dish放在cart中
            //     cart.dish = dish
            //     // cart.id = 666
            //     return cart
            // })
            // 遍历docs - 创建很多的promise对象 放在在数组中
            let arr = []
            docs.forEach(cart => {
                arr.push(dishModel.findOne({_id: cart.dishId}))
            })
            // 将数组放在promise.all中 - 等所有promise都都得到结果后，在一个then中处理所有
            Promise.all(arr).then(arr => {
                // console.log(arr);
                docs.forEach((cart, index) => {
                    docs[index].dish = arr[index]
                })
                xy(resp, 200, '购物车数量获取成功！', {
                    carts: docs
                })
            })
            
        } catch(err) {
            writeErr(err)
            xy(resp, 509, '购物车商品获取失败！')
        }
    }
}